﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.ServiceModel.Description;
using System.ServiceModel.Channels;
using System.Xml;
using System.ServiceModel;
using UniCT.LinkShareWpf.Interface;
using LinkShareWpf.Properties;


namespace UniCT.LinkShareWpf.CommunicationChannel
{
    public class Server
    {
        #region Private
        private ServiceHost serviceHost;
        private BasicHttpBinding bindingType;
        #endregion

        public Server ()
	    {
            bindingType = new BasicHttpBinding();
            
            // Definiamo la grandezza massima (in byte) che il server può ricevere.
            // Se il messaggio è maggiore di questa grandezza il mittente riceve una SOAP Fault.
            bindingType.MaxReceivedMessageSize = 240000;

            // Definisce i vincoli dei messaggi che possono essere processati dagli endpoint configurati con questo Binding
            // Durante la fase di deserializzazione del messaggio SOAP 
            // Nel nostro il vettore con lunghezza massima è quello di byte che fa riferimento all'immagine

            XmlDictionaryReaderQuotas readerQuotas = new XmlDictionaryReaderQuotas();
            readerQuotas.MaxArrayLength = 240000;
                       
            bindingType.ReaderQuotas = readerQuotas;
           
        }

        public void Stop()
        {
            
            if (serviceHost != null)
            {
                if (serviceHost.State == CommunicationState.Opened)
                {
                    serviceHost.Close();
                    Console.WriteLine("Server: Stop()");
                }
            }

        }

        public void Start()
        {
            try
            {
                serviceHost = new ServiceHost(typeof(Contract));
                serviceHost.AddServiceEndpoint(typeof(IContract), bindingType, Settings.Default.UriServer);
                serviceHost.Open();
                Console.WriteLine("Server Start(): " + Settings.Default.UriServer);
            }
            catch (Exception e)
            {
                Console.WriteLine(e.Message);
            }
        }

    }

}
